原文地址

1. 在then中使用reject

如果一个promise最初只定义了resolve,但是还想要使用reject怎么办?

可以在then中返回一个新的promise。这个retPromise 对象状态为Rejected的时候,会调用后面then中的 onRejected 方法,这样就实现了即使在then 中不使用 throw 也能进行reject处理了。

var onRejected = console.error.bind(console);
var promise = Promise.resolve();
promise.then(function () {
    var retPromise = new Promise(function (resolve, reject) {
       reject(new Error("this promise is rejected"));
    });
    return retPromise;
}).catch(onRejected);
// 使用Promise.reject还可以简化书写
var onRejected = console.error.bind(console);
var promise = Promise.resolve();
promise.then(function () {
    return Promise.reject(new Error("this promise is rejected"));  // 注意 Promise.reject其实只是new Promise的简洁写法   作用是一样的
}).catch(onRejected);

如果想直接更改promise的状态,那么使用reject()比使用throw要安全。 如果直接使用throw,就不太容易区分是主动抛出的error,还是代码中的error

2. Deferred和Promise之间的关系

(以jquery.deferred类似实现为例)

deferredpromise不是竞对,deferred包含promisedeferred具备对promise状态进行操作的特权方法。

所谓的能对Promise状态进行操作的特权方法,指的就是能对promise对象的状态进行resolvereject等调用的方法,而通常的Promise的话只能在通过构造函数传递的方法之内对promise对象的状态进行操作。

Promise 一般会在构造函数中编写逻辑,什么时候执行fulfilled回调,什么时候执行rejected回调。但是deferred只要定义一个对象之后,可以在任意时间调用resolve或者reject方法。

deferred最后返回return deferred.promise 可以继续链式调用。

换句话说,Promise代表了一个对象,这个对象的状态现在还不确定,但是未来一个时间点它的状态要么变为正常值(FulFilled),要么变为异常值(Rejected);而Deferred对象表示了一个处理还没有结束的这种事实,在它的处理结束的时候,可以通过Promise来取得处理结果。

3. thenable对象

thenable对象可以通过Promise.resolve转化成Promise对象。thenable对象就是一个具有 .then方法的一个对象。那么普通的callback也可以通过添加then方法变成thenable对象,这个转换过程是在resolve中进行的,转换中添加的then方法与后面使用 .then异步执行回调的then不是同一回事。

Todos:

  • promise 任务队列原理
  • promise扩展库是如何获取promise的状态以及取消promise动作的
  • promise反模式

4. 学习方法

学习之前要对所学的东西有个总体上的计划和步骤,有条理有重点的去开展。边学习边记录的方法虽然也没错,但是当你看完之后发现知识点都是零散的,也还是需要整理汇总。

由点到面再到点,这样后续总结回顾的时候也能够很清楚的找到重点和难点。


Tenacity
77 声望4 粉丝

有志者立长志,无志者常立志。